package models

import (
	"fmt"
	"gitee.com/gitee-go/core/common"
	"gitee.com/gitee-go/core/model/pipeline"
	"time"
)

type TPipelineVersion struct {
	Id                  string    `xorm:"not null pk VARCHAR(64)" json:"id"`
	Trigger             string    `xorm:"comment('触发方式') VARCHAR(100)" json:"trigger"`
	Events              string    `xorm:"comment('事件push、pr、note') VARCHAR(100)" json:"events"`
	Ref                 string    `xorm:"VARCHAR(255)" json:"ref"`
	Branch              string    `xorm:"VARCHAR(255)" json:"branch"`
	RepoId              string    `xorm:"VARCHAR(64)" json:"repoId"`
	Openid              string    `xorm:"-" json:"openid"`
	RepoName            string    `xorm:"VARCHAR(255)" json:"repoName"`
	CommitSha           string    `xorm:"VARCHAR(255)" json:"commitSha"`
	CommitMessage       string    `xorm:"comment('提交信息') TEXT" json:"commitMessage"`
	PipelineName        string    `xorm:"VARCHAR(255)" json:"pipelineName"`
	PipelineDisplayName string    `xorm:"VARCHAR(255)" json:"pipelineDisplayName"`
	PipelineId          string    `xorm:"VARCHAR(64)" json:"pipelineId"`
	Version             string    `xorm:"VARCHAR(255)" json:"version"`
	YmlContent          string    `xorm:"LONGTEXT" json:"ymlContent"`
	JsonContent         string    `xorm:"LONGTEXT" json:"jsonContent"`
	CreateTime          time.Time `xorm:"DATETIME" json:"createTime"`
	Deleted             int       `xorm:"default 0 TINYINT(1)" json:"deleted"`
	CreateUser          string    `xorm:"VARCHAR(255)" json:"createUser"`
	CreateUserId        string    `xorm:"VARCHAR(64)" json:"createUserId"`
	TargetRepoName      string    `xorm:"VARCHAR(255)" json:"targetRepoName"`
	TargetRepoSha       string    `xorm:"VARCHAR(255)" json:"targetRepoSha"`
	TargetRepoRef       string    `xorm:"VARCHAR(255)" json:"targetRepoRef"`
	TargetRepoCloneUrl  string    `xorm:"VARCHAR(255)" json:"targetRepoCloneUrl"`
	Status              string    `xorm:"comment('构建状态') VARCHAR(100)" json:"status"`
	Error               string    `xorm:"comment('错误信息') VARCHAR(500)" json:"error"`
	Note                string    `xorm:"VARCHAR(255)" json:"note"`
	RepoCloneUrl        string    `xorm:"VARCHAR(255)" json:"repoCloneUrl"`
}

type ShowPipelineVersionBuild struct {
	Id                  string `xorm:"not null pk VARCHAR(64)" json:"id"`
	Number              int64  `xorm:"comment('构建次数') BIGINT(20)" json:"number"`
	Trigger             string `xorm:"comment('触发方式') VARCHAR(100)" json:"trigger"`
	Events              string `xorm:"comment('事件push、pr、note') VARCHAR(100)" json:"events"`
	Ref                 string `xorm:"VARCHAR(255)" json:"ref"`
	Branch              string `xorm:"VARCHAR(255)" json:"branch"`
	RepoId              string `xorm:"VARCHAR(64)" json:"repoId"`
	RepoName            string `xorm:"VARCHAR(255)" json:"repoName"`
	CommitSha           string `xorm:"VARCHAR(255)" json:"commitSha"`
	CommitMessage       string `xorm:"comment('提交信息') TEXT" json:"commitMessage"`
	PipelineName        string `xorm:"VARCHAR(255)" json:"pipelineName"`
	PipelineDisplayName string `xorm:"VARCHAR(255)" json:"pipelineDisplayName"`
	PipelineId          string `xorm:"VARCHAR(64)" json:"pipelineId"`
	Version             string `xorm:"VARCHAR(255)" json:"version"`
	//YmlContent          string    `xorm:"LONGTEXT" json:"ymlContent"`
	//JsonContent         string    `xorm:"LONGTEXT" json:"jsonContent"`
	CreateTime         time.Time `xorm:"DATETIME" json:"createTime"`
	CreateUser         string    `xorm:"VARCHAR(255)" json:"createUser"`
	CreateUserId       string    `xorm:"VARCHAR(64)" json:"createUserId"`
	TargetRepoName     string    `xorm:"VARCHAR(255)" json:"targetRepoName"`
	TargetRepoSha      string    `xorm:"VARCHAR(255)" json:"targetRepoSha"`
	TargetRepoRef      string    `xorm:"VARCHAR(255)" json:"targetRepoRef"`
	TargetRepoCloneUrl string    `xorm:"VARCHAR(255)" json:"targetRepoCloneUrl"`
	Title              string    `xorm:"VARCHAR(255)" json:"prName"`
	PrNumber           int64     `xorm:"BIGINT(20)" json:"-"`

	//build
	Status     string    `xorm:"comment('构建状态') VARCHAR(100)" json:"status"`
	Error      string    `xorm:"comment('错误信息') VARCHAR(500)" json:"error"`
	Created    time.Time `xorm:"comment('创建时间') DATETIME" json:"created"`
	Started    time.Time `xorm:"comment('开始时间') DATETIME" json:"started"`
	Finished   time.Time `xorm:"comment('结束时间') DATETIME" json:"finished"`
	ExpendTime int64     `xorm:"-" json:"expendTime"`

	UrlBranch    string `xorm:"-" json:"urlBranch"`
	UrlCommitSha string `xorm:"-" json:"urlCommitSha"`
	UrlPr        string `xorm:"-" json:"urlPr"`

	TpvStatus   string `xorm:"VARCHAR(255)" json:"versionStatus"`
	BuildStatus string `xorm:"VARCHAR(255)" json:"buildStatus"`
	TpvError    string `xorm:"VARCHAR(255)" json:"-"`

	VersionMsg string `xorm:"-" json:"versionMsg"`

	Stages []*TStage `xorm:"-" json:"stages"`
}

func (c *ShowPipelineVersionBuild) CompletionFieldValue(repo *pipeline.TRepo) {
	c.ExpendTime = int64(c.Finished.Sub(c.Started).Seconds())
	if c.Finished.IsZero() && !c.Started.IsZero() {
		c.ExpendTime = int64(time.Since(c.Started).Seconds())
	}
	if repo.RepoType == common.GITEE {
		if RegGit.MatchString(repo.Url) {
			s := RegGit.FindStringSubmatch(repo.Url)
			repo.Url = s[1]
		}
	}
	c.UrlBranch = fmt.Sprintf("%v/tree/%v", repo.Url, c.Branch)
	c.UrlCommitSha = fmt.Sprintf("%v/commit/%v", repo.Url, c.CommitSha)
	if c.Events == common.EVENTS_TYPE_PR ||
		c.Events == common.GITEE_EVENT_PR_ACTION_UPDATE ||
		c.Events == common.EVENTS_TYPE_COMMENT {
		c.UrlBranch = fmt.Sprintf("%v/tree/%v", c.TargetRepoCloneUrl, c.TargetRepoRef)
		c.UrlCommitSha = fmt.Sprintf("%v/commit/%v", repo.Url, c.CommitSha)
		c.UrlPr = fmt.Sprintf("%v/pulls/%v", repo.Url, c.PrNumber)
	}
	c.Status = c.BuildStatus
	if c.TpvStatus != common.PIPELINE_VERSION_STATUS_OK {
		c.Status = c.TpvStatus
	}
	c.VersionMsg = c.TpvError
	if c.TpvStatus == common.PIPELINE_VERSION_STATUS_PENDING {
		c.VersionMsg = "yaml文件等待解析"
	}
	if c.TpvStatus == common.PIPELINE_VERSION_STATUS_PENDING {
		c.VersionMsg = "yaml文件正在解析中"
	}
}

type TStage struct {
	Id                string    `xorm:"not null pk unique VARCHAR(64)" json:"id"`
	BuildId           string    `xorm:"VARCHAR(64)" json:"buildId"`
	PipelineVersionId string    `xorm:"VARCHAR(100)" json:"pipelineVersionId"`
	Name              string    `xorm:"VARCHAR(255)" json:"name"`
	Stage             string    `xorm:"VARCHAR(255)" json:"stage"`
	DisplayName       string    `xorm:"VARCHAR(255)" json:"displayName"`
	Status            string    `xorm:"VARCHAR(100)" json:"status"`
	ExitCode          int       `xorm:"BIGINT" json:"exitCode"`
	Error             string    `xorm:"VARCHAR(100)" json:"error"`
	Started           time.Time `xorm:"DATETIME" json:"started"`
	Finished          time.Time `xorm:"DATETIME" json:"finished"`
	Created           time.Time `xorm:"DATETIME" json:"created"`
	Updated           time.Time `xorm:"DATETIME" json:"updated"`
	Version           string    `xorm:"VARCHAR(255)" json:"version"`
	OnSuccess         bool      `xorm:"BOOL" json:"onSuccess"`
	OnFailure         bool      `xorm:"BOOL" json:"onFailure"`
	Jobs              []*TJob   `xorm:"-" json:"steps"`
	Sort              int64     `xorm:"BIGINT" json:"sort"`
	ExpendTime        int64     `xorm:"-" json:"expendTime"`
}

type TJob struct {
	Id                string             `xorm:"not null pk VARCHAR(64)" json:"id"`
	Job               string             `xorm:"job" json:"step"`
	Name              string             `xorm:"VARCHAR(100)" json:"name"`
	DisplayName       string             `xorm:"VARCHAR(255)" json:"displayName"`
	BuildId           string             `xorm:"VARCHAR(64)" json:"buildId"`
	StageId           string             `xorm:"VARCHAR(100)" json:"stageId"`
	PipelineVersionId string             `xorm:"comment('流水线id') VARCHAR(64)" json:"pipelineVersionId"`
	Environments      map[string]string  `xorm:"JSON" json:"environments"`
	Commands          interface{}        `xorm:"-" json:"-"`
	Command           string             `xorm:"'commands'" json:"command"`
	Status            string             `xorm:"VARCHAR(100)" json:"status"`
	ExitCode          int                `xorm:"BIGINT" json:"exitCode"`
	Error             string             `xorm:"VARCHAR(100)" json:"error"`
	Started           time.Time          `xorm:"DATETIME" json:"started"`
	Finished          time.Time          `xorm:"DATETIME" json:"finished"`
	Created           time.Time          `xorm:"DATETIME" json:"created"`
	Updated           time.Time          `xorm:"DATETIME" json:"updated"`
	Version           string             `xorm:"VARCHAR(255)" json:"version"`
	Errignore         bool               `xorm:"BOOL" json:"errignore"`
	Number            int64              `xorm:"BIGINT" json:"number"`
	DependsOn         []string           `xorm:"JSON" json:"dependsOn"`
	Image             string             `xorm:"VARCHAR(255)" json:"image"`
	Sort              int64              `xorm:"BIGINT" json:"sort"`
	Artifacts         []*TArtifact       `xorm:"-" json:"artifacts"`
	DependArtifacts   []*TDependArtifact `xorm:"-" json:"dependArtifacts"`
	ExpendTime        int64              `xorm:"-" json:"expendTime"`
}

type TArtifact struct {
	Id         string    `xorm:"not null pk VARCHAR(64)" json:"id"`
	JobId      string    `xorm:"comment('jobid') VARCHAR(64)" json:"jobId"`
	BuildId    string    `xorm:"VARCHAR(64)" json:"buildId"`
	StageId    string    `xorm:"VARCHAR(64)" json:"stageId"`
	BuildName  string    `xorm:"comment('构建状态') VARCHAR(100)" json:"buildName"`
	StageName  string    `xorm:"comment('退出码') VARCHAR(100)" json:"stageName"`
	JobName    string    `xorm:"comment('错误信息') VARCHAR(500)" json:"jobName"`
	Status     string    `xorm:"comment('名字') VARCHAR(100)" json:"status"`
	Created    time.Time `xorm:"comment('创建时间') DATETIME" json:"created"`
	Updated    time.Time `xorm:"comment('更新时间') DATETIME" json:"updated"`
	Name       string    `xorm:"comment('版本') VARCHAR(255)" json:"name"`
	Scope      string    `xorm:"VARCHAR(255)" json:"scope"`
	Path       string    `xorm:"VARCHAR(255)" json:"path"`
	Repository string    `xorm:"VARCHAR(255)" json:"repository"`
	Value      string    `xorm:"VARCHAR(255)" json:"value"`
}

type TDependArtifact struct {
	Id          string    `xorm:"not null pk VARCHAR(64)" json:"id"`
	JobId       string    `xorm:"comment('jobid') VARCHAR(64)" json:"jobId"`
	BuildId     string    `xorm:"VARCHAR(64)" json:"buildId"`
	StageId     string    `xorm:"VARCHAR(64)" json:"stageId"`
	BuildName   string    `xorm:"comment('构建状态') VARCHAR(100)" json:"buildName"`
	StageName   string    `xorm:"comment('退出码') VARCHAR(100)" json:"stageName"`
	JobName     string    `xorm:"comment('错误信息') VARCHAR(500)" json:"jobName"`
	Status      string    `xorm:"comment('名字') VARCHAR(100)" json:"status"`
	Created     time.Time `xorm:"comment('创建时间') DATETIME" json:"created"`
	Updated     time.Time `xorm:"comment('更新时间') DATETIME" json:"updated"`
	Name        string    `xorm:"comment('版本') VARCHAR(255)" json:"name"`
	Type        string    `xorm:"VARCHAR(255)" json:"type"`
	IsForce     int       `xorm:"TINYINT(1)" json:"isForce"`
	Repository  string    `xorm:"VARCHAR(255)" json:"repository"`
	Target      string    `xorm:"VARCHAR(255)" json:"target"`
	SourceStage string    `xorm:"VARCHAR(255)" json:"sourceStage"`
	SourceJob   string    `xorm:"VARCHAR(255)" json:"sourceStep"`
	Value       string    `xorm:"VARCHAR(255)" json:"value"`
}
